// 隧道围岩长度计算算法

/**
 * 隧道围岩长度计算输入参数接口
 */
export interface TunnelSurroundingRockInput {
  inputs: Array<{value: number}>; // 围岩分段长度数组
  slope: number; // 坡度系数
  entranceLength: number; // 进洞口长度(m)
  exitLength: number; // 出洞口长度(m)
}

/**
 * 隧道围岩长度计算算法类
 * 提供隧道工程中围岩长度计算相关的算法实现
 * 支持实时计算隧道衬砌实际长度
 */
export class TunnelSurroundingRockAlgorithms {
  /**
   * 计算隧道衬砌实际长度
   * 基于围岩分段长度、坡度、进洞口长度和出洞口长度计算衬砌实际长度
   * 
   * @param input 结构化输入参数对象
   * @returns 计算结果，包含各段衬砌实际长度和总衬砌长度
   */
  static async calculateLiningLength(input: TunnelSurroundingRockInput): Promise<{
    segmentLiningLengths: number[]; // 各段衬砌实际长度
    totalLiningLength: number;     // 总衬砌实际长度
    entranceAndExitTotal: number;  // 洞口总长度
  }> {
    // 参数验证
    if (!input) {
      throw new Error('输入参数对象不能为空');
    }
    
    const { inputs, slope, entranceLength, exitLength } = input;
    
    // 验证inputs数组
    if (!Array.isArray(inputs)) {
      throw new Error('inputs必须是数组类型');
    }
    
    // 即使输入参数少于8个也能计算，提高灵活性
    if (inputs.length === 0) {
      throw new Error('至少需要一个围岩分段长度');
    }
    
    // 验证并处理坡度参数
    const effectiveSlope = typeof slope === 'number' && slope > 0 ? slope : 1.0;
    
    // 验证并处理洞口长度参数
    const effectiveEntranceLength = typeof entranceLength === 'number' && entranceLength >= 0 ? entranceLength : 0;
    const effectiveExitLength = typeof exitLength === 'number' && exitLength >= 0 ? exitLength : 0;
    
    console.log('开始计算隧道衬砌长度...');
    console.log('输入参数:', { inputs, slope: effectiveSlope, entranceLength: effectiveEntranceLength, exitLength: effectiveExitLength });
    
    // 计算各段围岩的衬砌实际长度
    const segmentLiningLengths = inputs.map((segment, index) => {
      const segmentLength = segment?.value && typeof segment.value === 'number' && !isNaN(segment.value) ? segment.value : 0;
      const calculatedLength = segmentLength * effectiveSlope;
      console.log(`段${index + 1}原始长度: ${segmentLength}, 坡度系数: ${effectiveSlope}, 衬砌长度: ${calculatedLength}`);
      return calculatedLength;
    });
    
    // 计算围岩分段总长度
    const segmentsTotalLength = segmentLiningLengths.reduce((sum, length) => sum + length, 0);
    
    // 计算洞口总长度（同样应用坡度系数）
    const entranceAndExitTotal = (effectiveEntranceLength + effectiveExitLength) * effectiveSlope;
    
    // 计算总衬砌实际长度（各段长度 + 洞口长度）
    const totalLiningLength = segmentsTotalLength + entranceAndExitTotal;
    
    const result = {
      segmentLiningLengths,
      totalLiningLength,
      entranceAndExitTotal
    };
    
    console.log('隧道衬砌长度计算结果:', result);
    
    return result;
  }
}